home *** CD-ROM | disk | FTP | other *** search
/ Gold Medal Software 3 / Gold Medal Software - Volume 3 (Gold Medal) (1994).iso / archive / cx201e.arj / CXF.C < prev    next >
C/C++ Source or Header  |  1994-03-01  |  5KB  |  175 lines

  1. /* 
  2.    Cx, CXSUB example program.
  3.    Copyright (c) 1990-1994 Eugene Nelson, Four Lakes Computing.
  4. */
  5.  
  6. #include <stddef.h>
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. #include <ctype.h>
  10. #include <conio.h>
  11.  
  12. /*
  13.    Uncomment the following CXANSI define when using CXF/CXSUB with
  14.    with CX.C.  Or, if you are using Cx with a C compiler exclusively,
  15.    you may add #define CXANSI to the beginning of CX.H.
  16. */
  17.  
  18. /* #define CXANSI */
  19.  
  20. #include "cx.h"
  21. #include "cxsub.c"
  22.  
  23. #ifndef TRUE
  24.    #define TRUE   1
  25.    #define FALSE  0
  26. #endif
  27.  
  28. #define NAME      "cxf"
  29.  
  30. /*-------------------------------------------------------------------------*/
  31. void  USAGE(void)
  32. {
  33.    printf("usage: %s [options] infile [outfile]\n", NAME);
  34.    printf("   -1    compress infile to outfile using CX_METHOD1\n");
  35.    printf("   -2    compress infile to outfile using CX_METHOD2\n");
  36.    printf("   -3    compress infile to outfile using CX_METHOD3\n");
  37.    printf("   -c    compress infile to outfile using CX_METHODC\n");
  38.    printf("   -d    compress infile to outfile using CX_METHODD\n");
  39.    printf("   -x    decompress (extract) infile to outfile\n");
  40.    printf("   -i    test integrity of infile\n");
  41.    printf("   -b[n] buffer size (in K) when compressing (default CX_MAX_BUFFER)\n");
  42.    printf("   -t[n] temporary size (in K) when compressing (default CX_C_MAXTEMP)\n");
  43.    printf("   -q    quiet, no progress information\n");
  44.    printf("\n");
  45.    printf("   Examples:\n");
  46.    printf("      %s -1 -b63 -t63 cx.doc cfile.dat\n", NAME);
  47.    printf("      %s -i cfile.dat\n", NAME);
  48.    printf("      %s -x cfile.dat dfile.dat\n", NAME);
  49.    exit (0);
  50. }
  51.  
  52. typedef struct {
  53.    int   quiet;
  54.    int   interrupted;
  55. } ARECORD;
  56.  
  57. /*-------------------------------------------------------------------------*/
  58. int   callback(void *p)
  59. {
  60.    ARECORD  *a = (ARECORD *)p;
  61.  
  62.    if (!a->quiet)
  63.    {
  64.       printf(".");
  65.       flushall();    /* This line is not ANSI, and is only used for  */
  66.                      /* timely console progress.  It may be removed. */
  67.    }
  68.  
  69. #ifndef NOKBHIT
  70.    if (kbhit())
  71.    {
  72.       a->interrupted = TRUE;
  73.       return (-1);            /* any non-zero return will work */
  74.    }
  75. #endif
  76.  
  77.    return (0);
  78. }
  79.  
  80. /*-------------------------------------------------------------------------*/
  81. int   main(int argc, char *argv[])
  82. {
  83.    CXINT ret;
  84.    CXINT method = 0;
  85.    CXINT buffsize = CX_MAX_BUFFER;
  86.    CXINT tempsize = CX_C_MAXTEMP;
  87.  
  88.    ARECORD  arecord;
  89.    int   extract = FALSE;
  90.    int   test = FALSE;
  91.    int   j;
  92.    char  *iname = NULL;
  93.    char  *oname = NULL;
  94.  
  95.    printf("Cx Test Program, Copyright (c) 1990-1994 Four Lakes Computing\n");
  96.    printf("   ┌────────────────────────────────────────────────────────────────┐\n");
  97.    printf("   │The evaluation object code runs MUCH slower than the object code│\n");
  98.    printf("   │that may be purchased.  Run TEST.EXE for EXACT speed and size   │\n");
  99.    printf("   │measurements.                                                   │\n");
  100.    printf("   └────────────────────────────────────────────────────────────────┘\n");
  101.  
  102.    arecord.interrupted = FALSE;
  103.    arecord.quiet = FALSE;
  104.  
  105.    for (j=1; j<argc; ++j)
  106.    {
  107.       if (argv[j][0] == '-')
  108.          switch (toupper(argv[j][1]))
  109.          {
  110.             case '1':   method = CX_METHOD1;    break;
  111.             case '2':   method = CX_METHOD2;    break;
  112.             case '3':   method = CX_METHOD3;    break;
  113.             case 'C':   method = CX_METHODC;    break;
  114.             case 'D':   method = CX_METHODD;    break;
  115.  
  116.             case 'I':   test = TRUE;            break;
  117.             case 'X':   extract = TRUE;         break;
  118.             case 'Q':   arecord.quiet = TRUE;   break;
  119.  
  120.             case 'T':   tempsize = atoi(&argv[j][2]) * 1024;   break;
  121.  
  122.             case 'B':   
  123.                buffsize = atoi(&argv[j][2]) * 1024;
  124.                if (buffsize == 0)
  125.                   USAGE ();
  126.                break;
  127.  
  128.             default:
  129.                USAGE ();
  130.          }
  131.       else
  132.       {
  133.          if (iname == NULL)
  134.             iname = argv[j];
  135.          else
  136.             oname = argv[j];
  137.       }
  138.    }
  139.  
  140.    if (iname == NULL)
  141.       USAGE ();
  142.  
  143.    if ((method != 0) && (oname == NULL))
  144.       USAGE ();
  145.  
  146.    if (extract && (oname == NULL))
  147.       USAGE ();
  148.  
  149.    if (!test && !extract && (method == 0))
  150.       USAGE ();
  151.  
  152. #ifndef NOKBHIT
  153.    printf("Press any key to stop.\n");
  154. #endif
  155.  
  156.    if (test)
  157.       ret = cx_decompress_file(NULL, iname, callback, &arecord);
  158.    else if (extract)
  159.       ret = cx_decompress_file(oname, iname, callback, &arecord);
  160.    else if (method != 0)
  161.       ret = cx_compress_file(oname, iname, method, buffsize, tempsize, 
  162.                               callback, &arecord);
  163.  
  164.    printf("\n");
  165.  
  166.    if (arecord.interrupted)
  167.       printf("Interrupted.\n");
  168.    else if (ret == 0)
  169.       printf("Ok.\n");
  170.    else
  171.       printf("Error: %s\n", cx_error_message(ret));
  172.  
  173.    return (0);
  174. }
  175.